package internal

import (
	"fmt"
	"log"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

var C *Config

// Config 定义整个配置文件的结构体
type Config struct {
	Database `mapstructure:"database"`
}

func New() *Config {
	return &Config{}
}
func (c *Config) Config() *Config {
	v := viper.New()
	// 配置 Viper
	v.SetConfigName("gormgen") // 配置文件名，不需要扩展名
	v.SetConfigType("yaml")    // 配置文件类型
	v.AddConfigPath("../")
	v.AddConfigPath("./hack/dbtool")

	// 读取配置文件
	if err := v.ReadInConfig(); err != nil {
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			log.Fatalf("配置文件未找到: %v", err)
		} else {
			log.Fatalf("读取配置文件时出错: %v", err)
		}
	}

	// 监控配置文件变化
	v.WatchConfig()

	v.OnConfigChange(func(e fsnotify.Event) {
		log.Printf("配置文件发生变化: %s", e.Name)
		if err := v.Unmarshal(&c); err != nil {
			fmt.Println(err)
		}
		log.Printf("重载配置文件成功: %s", e.Name)
	})

	// 解析配置文件到结构体
	if err := v.Unmarshal(&c); err != nil {
		log.Fatalf("解析配置文件时出错: %v", err)
	}

	return c
}

func initConfig() {
	C = New().Config()
}
